import globalConfig from '../config.js'

//手机号码验证
const check_phone = function(val) {
	return /^1[3456789]\d{9}$/.test(val)
};

//邮箱验证
const check_email = function(val) {
	return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(val)
}

//身份证验证
const check_idcard = function(idCard) {
	var flag = false;
	//15位和18位身份证号码的正则表达式
	var regIdCard=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
		
	//如果通过该验证，说明身份证格式正确，但准确性还需计算
	if(regIdCard.test(idCard)){
	    if(idCard.length==18){
	        var idCardWi=new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
	        var idCardY=new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后，可能产生的11位余数、验证码，也保存成数组
	        var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
	        for(var i=0;i<17;i++){
	            idCardWiSum+=idCard.substring(i,i+1)*idCardWi[i];
	        }
		
	        var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
	        var idCardLast=idCard.substring(17);//得到最后一位身份证号码
		
	        //如果等于2，则说明校验码是10，身份证号码最后一位应该是X
	        if(idCardMod==2){
	            if(idCardLast=="X"||idCardLast=="x"){
	                flag = true;
	            }else{
	                flag = false;
	            }
	        }else{
	            //用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
	            if(idCardLast==idCardY[idCardMod]){
	                flag = true;
	            }else{
	                flag = false;
	            }
	        }
	    }else if(idCard.length==15){
	        var id17 = idCard.substring(0,6) + '19' + idCard.substring(6);
	        var parityBit = getParityBit(id17);
	        var tempIdCard =  id17 + parityBit;
	        flag = check_idcard(tempIdCard);
	    } 
	 }else{
	    flag = false;
	 }
	 return flag;
};

//判断IOS设备
const check_ios = function() {
	let u = navigator.userAgent;
	let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios苹果
	return isiOS
};

//判断Adr设备
const check_adr = function() {
	let u = navigator.userAgent;
	let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android安卓
	return isAndroid
};

// 全局配置
const global_config = globalConfig

//判断值的类型
const check_value_type = function(n) {
	if (Object.prototype.toString.call(n) === '[object Array]') { //注意： 前一个object首字母是小写
		return 'array';
	} else if (Object.prototype.toString.call(n) === '[object Object]') {
		return 'object';
	} else {
		return 'other';
	}
}

// 判断应用是否安装
const check_app_install = function(app) {
	let allApp = uni.getStorageSync('getApplication');
	return allApp[app] ? allApp[app] : false;
}

// 判断应用是否开启使用模块显示关闭处理
const check_model_open = function(typeid) {
	let allModel = uni.getStorageSync('uniappModelData');
	return allModel[typeid] ? true : false;
}

// 根据typeid返回应用名称
const get_modelname_typeid = function(typeid){
	let modelData = uni.getStorageSync('uniappModelData');
	return modelData[typeid] ? modelData[typeid].name : '';
}

/**
 * 按格式返回日期
 * @param {string} datestr 时间戳
 * @param {string} fmt 时间格式 "yyyy-MM-dd hh:mm:ss"
 */
const get_date_format = function(datestr = '', fmt = "yyyy-MM-dd") {
	if (datestr) {
		// 判断是否是时间戳
		if (/^(\d{10}|\d{13})$/.test(datestr)) {
			// 检查是多少位的时间戳 10位 13位
			let len = datestr.length;
			datestr = len == 10 ? new Date(datestr * 1000) : new Date(datestr * 1);
		}
	} else {
		datestr = new Date();
	}
	let o = {
		"M+": datestr.getMonth() + 1, // 月份
		"d+": datestr.getDate(), // 日
		"h+": datestr.getHours(), // 小时
		"m+": datestr.getMinutes(), // 分
		"s+": datestr.getSeconds(), // 秒
		// "q+": datestr.floor((datestr.getMonth() + 3) / 3), // 季度
		"S": datestr.getMilliseconds()
		// 毫秒
	};
	if (/(y+)/.test(fmt))
		fmt = fmt.replace(RegExp.$1, (datestr.getFullYear() + "")
			.substr(4 - RegExp.$1.length));
	for (let k in o)
		if (new RegExp("(" + k + ")").test(fmt))
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) :
				(("00" + o[k]).substr(("" + o[k]).length)));
	return fmt;
}

/** 
 * 订单关闭时间倒计时 倒计时为零时返回空
 * @param {number} closetime 时间戳
 */
const count_down_close_time = function(closetime, type) {
	let needtime,nowtime,day,hours,minutes,seconds;
	if(type == 1){
		needtime = closetime;
	}
	else{
		// 当前时间
		nowtime = (new Date()).getTime();
		nowtime = parseInt(nowtime / 1000);
		// 关闭时间
		closetime = parseInt(closetime);
		needtime = closetime - nowtime;
	}
	
	if (closetime <= 0 || needtime <= 0) {
		return '';
	} else {
		day = parseInt(needtime / (60 * 60 * 24));
		hours = parseInt((needtime % (60 * 60 * 24)) / (60 * 60));
		minutes = parseInt((needtime % (60 * 60)) / 60);
		seconds = parseInt(needtime % 60);
		return {
			'day': day ,
			'hour': hours,
			'minutes': minutes,
			'seconds': seconds
		};
	}
}

/**
 * 检查是否是微信浏览器
 */
const isWxClient = function() {
	// #ifdef H5
	// window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息，这个属性可以用来判断浏览器类型
	let ua = window.navigator.userAgent.toLowerCase()
	// 通过正则表达式匹配ua中是否含有MicroMessenger字符串
	if (ua.match(/MicroMessenger/i) == 'micromessenger') {

		return true

	} else {

		return false

	}
	// #endif
	return false
}

/**
 * url地址处理 参数统一由键值对组合 
 * 并通过encodeURIComponent处理 
 * 接收到的数据要通过decodeURIComponent处理
 * @param {Object} url
 * @param {Object} params 参数
 */
const stUrlComponent = function(url, params) {
	let prefix = ''; // 拼接参数
	for (let i in params) {
		if(params[i])
		{
			url += prefix + i + '=' + encodeURIComponent(params[i]);
			prefix = '&';
		}
	}
	return url;
}

/**
 * url参数数组值解码处理
 * @param {Object} params
 */
const decodeUrlParams = function(params) {
	for (let i in params) {
		params[i] = decodeURIComponent(params[i]);
	}
	return params;
}

/**
 * 滚动到指定锚点
 * @param {Object} that 	 this对象
 * @param {String} el 		 锚点ID
 * @param {Number} scrollTop 距离
 * @param {Number} duration  速度
 */
const scrollAnchor = function(that, el, scrollTop, duration = 100) {
	let view = uni.createSelectorQuery().in(that).select(el);
	view.boundingClientRect(data => {
		uni.pageScrollTo({
			scrollTop: scrollTop + data.top,
			duration: duration
		});
	}).exec();
}

/**
 * 滚动时联动标记导航
 * @param {Object} that 	 this对象
 * @param {String} el 		 锚点ID
 * @param {Number} length    导航lengh
 */
const scrollLinkage = function(that, el, length) {
	for (let i = 0; i <= length; i++) {
		let view = uni.createSelectorQuery().in(that).select(el + '' + i);
		view.boundingClientRect(data => {
			that.navscroll.splice(i, 1, data.top);
		}).exec();
		if (that.navscroll[i] > 50 && i - 1 >= 0) {
			that.active = i - 1;
			return;
		}
	}
}

/**
 * 处理产品满意度
 * @param {Object} str
 */
const satisfyscore = function(str){
	if(str && str != '0')
	{
		// 判断是否包含 "%";
		if(str.indexOf("%") == -1){
			str += "%";
		}
	}
	else
	{
		str = "100%";
	}
	return str;
}

/**
* 坐标转换，百度地图坐标转换成腾讯地图坐标
* lng 腾讯经度（pointy）
* lat 腾讯纬度（pointx）
* 经度>纬度
*/
const bMapToQQMap = function(lng, lat) {

    if (lng == null || lng == '' || lat == null || lat == '')
        return [lng, lat];

    var x_pi = 3.14159265358979324;
    var x = parseFloat(lng) - 0.0065;
    var y = parseFloat(lat) - 0.006;
    var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
    var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
    var lng = (z * Math.cos(theta)).toFixed(7);
    var lat = (z * Math.sin(theta)).toFixed(7);

    return [lng, lat];

}
/**
 * 批量处理/或者单个处理值为null/undefined的情况 返回''
 * @param {Object,String} item
 */
const dealStrNull = function(item){
	if(check_value_type(item) == 'object')
	{
		for(let key in item)
		{
			if(item[key] === 'undefined' || item[key] === undefined || item[key] === null || item[key] === 'null')
			{
				item[key] = '';
			}
		}
	}
	else
	{
		if(item === 'undefined' || item === undefined || item === null || item === 'null')
		{
			item = '';
		}
	}
	
	return item;
}

/**
 * 防抖函数
 * @param {Function} fn     回调函数
 * @param {Number}   delay  延时
 * */
const debounce = function(fn,delay) {
	let timeout = null;
	return function () {
		if(timeout){
			clearTimeout(timeout);
		}
		timeout = setTimeout(() => {
			fn.apply(this, arguments);
		},delay);
	}
}

/**
 * 防抖函数
 * @param {Function} fn     回调函数
 * @param {Number}   wait   延时
 * */
const throttle = function(fn, wait) {
    let pre = 0;
    return function () {
        let now = new Date().getTime();
        if (now - pre > wait) {
            pre = now;
            fn.apply(this);
        }
    }
}

/**
 * 全局路由参数管理
 * @param {Object} options
 */
const optionsManager = function(options){
	if(options.scene) 
	{   
		// 目前针对微信小程序
		let scene = decodeURIComponent(options.scene);
		if(scene.indexOf('=') != -1){
			let newobj = new Object();
			//分销二维码
			scene = scene.split('&');
			for (var i = 0; i < scene.length; i++) {
				let si = scene[i].split('=');
				newobj[si[0]] = unescape(si[1]);
			}
			if(newobj.fxpcode)
			{
				wx.setStorageSync('fxpcode', newobj.fxpcode)
			}
			
			options = newobj;
		}else if(options.scene.length == 8){
			if(options.scene)
			{
				uni.setStorageSync('fxpcode', options.scene);
			}
		}
	}
	else if(options.fxpcode)
	{
		wx.setStorageSync('fxpcode', options.fxpcode)
	}
	return options;
}


/**
 * 节点信息获取
 * @param {type}  
 * 
 * */
const getRect = function(selector){
	return new Promise((resolve, reject) => {
		uni.createSelectorQuery().select('.editor-block').fields({
			rect: true,
			size: true,
			scrollOffset: true
		}, (res) => {
			resolve(res)
		}).exec()
	})
} 

/**
 * 判断当前所在端
 * 
 * */
const getProt = function(){   
	// #ifdef MP-WEIXIN
	return 1;
	// #endif
	// #ifdef MP-TOUTIAO
	return 2;
	// #endif
	// #ifdef MP-ALIPAY
	return 3;
	// #endif
	// #ifdef H5
	return 4;
	// #endif
}

/**
 * 获取当前页面路径
 * 
 * */
 const getRoute = function(){
	 let pages = getCurrentPages();
	 let currentPage = pages[pages.length - 1];
	 let currentPath = `/${currentPage.route}`;;
	 return currentPath
 }

/**
 * 转换数字格式
 * @param {Number} num 需要转换格式的数字
 * @description 针对月份和日期统一格式: 1 => 01, 2 => 02
 * 
 */
const transfromFormater = function(num) {
	if (num === undefined || num === null || num === NaN) return
	return num < 10 ? `0${num}` : `${num}`
}

/**
 * 返回天数区间的日期数据对象
 * @param {Date, String} Date 开始的日期, 默认当天: new Date, '2023-01-01', '2023/01/01'
 * @param {Number} dayNum 一个具体的天数
 * @description 传入开始的日期, 默认当天, 返回一个固定天数内的日期对象 默认90天
 */
const dateAreaData = function(sDate = new Date(), dayNum = 90) {
	let myDate = new Date(sDate).toLocaleDateString()
	let dayTime = 60 * 60 * 24 * 1000
	let dayList = []
	myDate = myDate.replace(/-/gi, '/')

	for (var i = 0; i < dayNum; i++) {
		let curDate, year, month, date, week, day, dayweek
		
		curDate = new Date(new Date(myDate).getTime() + dayTime * i)
		
		year = transfromFormater(curDate.getFullYear())
		month = transfromFormater(curDate.getMonth() + 1)
		day = transfromFormater(curDate.getDate())
		date = `${year}-${month}-${day}`
		dayweek = toWeekDay(curDate.getDay())
		
		if(i===0){
			week = `今天`
		}else if(i === 1){
			week = `明天`
		}else if(i === 2){
			week = `后天`
		}else{
			week = `周${toWeekDay(curDate.getDay())}`
		}

		dayList.push({
			day,
			month,
			week,
			year,
			date,
			dayweek
		})
	}

	
	 let startDate = dayList[0].date
	 let endDate = dayList[dayList.length - 1].date
	
	return {
		dayList,
		startDate,
		endDate
	}
}

/**
 * 星期转化中文
 * @param {Number} weekDay 传入数据 讲一周的某一天返回成中文状态下的字符
 */
const toWeekDay = function(weekDay) { 
	switch (weekDay) {
		case 1:
			return '一';
			break;
		case 2:
			return '二';
			break;
		case 3:
			return '三';
			break;
		case 4:
			return '四';
			break;
		case 5:
			return '五';
			break;
		case 6:
			return '六';
			break;
		case 0:
			return '日';
			break;
		default:
			break;
	}
	return '传入未知参数';
}

export {
	check_phone,
	check_email,
	check_idcard,
	check_ios,
	check_adr,
	global_config,
	check_value_type, // 判断值的类型
	get_date_format, // 按格式返回日期 默认 "yyyy-MM-dd"
	check_app_install, // 判断应用是否安装
	check_model_open, // 判断应用是否开启
	get_modelname_typeid, // 根据typeid返回应用名称
	count_down_close_time, // 订单关闭时间倒计时
	isWxClient, // 检查是否是微信浏览器
	stUrlComponent, // url地址处理 参数统一由键值对组合 
	decodeUrlParams, // url 参数数组值解码处理
	scrollAnchor, // 滚动到指定锚点
	scrollLinkage, // 滚动联动导航
	satisfyscore,// 处理产品满意度显示 "10" "10%" 
	bMapToQQMap, // 百度转腾讯经纬度
	debounce, // 防抖函数
	throttle, // 防抖函数
	dealStrNull, // 批量处理/单个处理值为null/undefined的情况 返回''
	optionsManager, // 全局路由参数管理
	getRect,
	getProt,//获取当前所在端
	getRoute,//获取当前页面路径
	dateAreaData
}
